#!/bin/bash

set -o errexit
set -o nounset
set -o pipefail

function key {
  git config --local --get "${1}"
}

function addkey {
  git config --local --add "${1}" "${2}"
}

function detect {
  local repoURL="$1"
  local repoName="$2"
  local detectionScript=${DETECTION_SCRIPT:-}
  local buildStrategy=${BUILD_STRATEGY:-}
  local strategyArg=""
  if [[ -n "$buildStrategy" ]]; then 
    strategyArg="--strategy=${buildStrategy}"
  fi

  # The purpose of using a custom detection script is that users can customize the 
  # 'detect-language' script to return the image that's appropriate for their needs. 
  # It is possible to just have new-app do code detection. In that case, just set
  # the DETECTION_SCRIPT variable to an empty string.
  if [[ -z $detectionScript ]]; then
    oc new-app "${repoURL}" $strategyArg
  else
    if ! lang=$($(dirname $0)/${detectionScript}); then
      return
    fi
    echo "detect: found language ${lang} for ${repoName}"
    oc new-app "${lang}~${repoURL}" $strategyArg
  fi
  # TODO: when a command to set a secret is available,
  # set an optional secret on the resulting build configuration
}

# If the 'oc' command is not found, exit
if ! oc=$(which oc); then
  echo "detect: oc is not installed"
  exit 0
fi

# If the current repository has no self.url, exit
if ! url=$(key gitserver.self.url); then
  echo "post-receive: no self url set"
  exit 0
fi

# Save received commits to a temporary file
commits=$(mktemp)
cat > ${commits}

# Extract the name of the repository from the URL
name=$(basename "${url}")
name="${name%.*}"

foundbc=false
# Loop through build configurations that match this git repository
while read bc ref
do
  foundbc=true
  # If a generic webhook exists on the build config, determine if one of the received
  # commits affects the reference in the build configuration
  if webhook=$(oc start-build --list-webhooks="generic" "${bc}" | head -n 1); then
    # Loop through the commits received by the hook. If the build configuration's git ref is an
    # ancestor for the received commit, then start a new build for it.
    while read old_commit new_commit ref_name
    do
      if $(git merge-base --is-ancestor "${ref}" "${new_commit}"); then
        oc start-build --from-webhook="${webhook}" && echo "build: started on build configuration '${bc}'"
        break
      fi
    done < "${commits}"
  fi
done < <(gitrepo-buildconfigs "${name}")

if $foundbc; then
  exit 0
fi

generate_artifacts=${GENERATE_ARTIFACTS:-}
if [ "${generate_artifacts}" == "true" ]; then
  detect "$url" "$name"
fi
